<?php

namespace app\index\controller;

use phpmailer\Email;
use think\Controller;
use think\Request;
use wxpay\database\WxPayCloseOrder;
use wxpay\database\WxPayResults;
use wxpay\database\WxPayUnifiedOrder;
use wxpay\NativePay;
use wxpay\WxPayConfig;
use wxpay\WxPayApi;
use wxpay\PayNotifyCallBack;
use wxpay\database\WxPayNotify;
class Pay extends Base
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function alipay($id)
    {
        $data = model('order')->get($id);
        include_once './alipay/config.php';
        include_once './alipay/pagepay/service/AlipayTradeService.php';
        include_once './alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';

        //商户订单号，商户网站订单系统中唯一订单号，必填
        $out_trade_no = $data->out_trade_no;

        //订单名称，必填
        $subject = 'test';

        //付款金额，必填
        $total_amount = $data->total_price;

        //商品描述，可空
        $body = '';

        //构造参数
        $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
        $payRequestBuilder->setBody($body);
        $payRequestBuilder->setSubject($subject);
        $payRequestBuilder->setTotalAmount($total_amount);
        $payRequestBuilder->setOutTradeNo($out_trade_no);

        $aop = new \AlipayTradeService($config);

        /**
         * pagePay 电脑网站支付请求
         * @param $builder 业务参数，使用buildmodel中的对象生成。
         * @param $return_url 同步跳转地址，公网可以访问
         * @param $notify_url 异步通知地址，公网可以访问
         * @return $response 支付宝返回的信息
         */
        $response = $aop->pagePay($payRequestBuilder, $config['return_url'], $config['notify_url']);

        //输出表单
        var_dump($response);
    }

    public function wxpayqcode($id)
    {
        if (!$id) {
            $this->error('数据不合法');
        }
        $data = model('order')->get($id);
        if (empty($data) || $data->status != 1 || $data->pay_status != 0) {
            $this->error('无法进行付款操作');
        }
        //判断是否是当前用户本人
        if ($data->user_name != $this->getLoginUser()->username) {
            $this->error('仅限本人支付');
        }
        //获取订单信息
        $deal = model('deal')->get($data->deal_id);
        //生成验证码
        $notify = new NativePay();
        $input = new WxPayUnifiedOrder();
        $input->setBody($deal->name);
        $input->setAttach($deal->name);
        $input->setOutTradeNo($data->out_trade_no);
        $input->setTotalFee($data->total_price * 100);
        $input->setTimeStart(date("YmdHis"));
        $input->setTimeExpire(date("YmdHis", time() + 600));
        $input->setGoodsTag("QRCode");
        $input->setNotifyUrl("http://116.62.125.14/index.php/index/pay/weixinnotify");
        $input->setTradeType("NATIVE");
        $input->setProductId($id);
        $result = $notify->getPayUrl($input);
        if (empty($result['code_url'])) {
            $url = '';
        } else {
            $url = $result['code_url'];
        }
        //组装数据
        $order = [
            'name' => $deal->name,
            'count' => $data->deal_count,
            'total' => $data->total_price,
            'url' => $url,
            'id' => $data->id
        ];
        return $this->fetch('', ['order' => $order]);

    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function return_url()
    {
        include_once '/alipay/config.php';
        include_once '/alipay/pagepay/service/AlipayTradeService.php';
        $arr = $_GET;
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if ($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = htmlspecialchars($_GET['out_trade_no']);

            //支付宝交易号
            $trade_no = htmlspecialchars($_GET['trade_no']);

            echo "验证成功<br />支付宝交易号：" . $trade_no;

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        } else {
            //验证失败
            echo "验证失败";
        }
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request $request
     * @return \think\Response
     */
    public function weixinnotify()
    {
        $weixinData = file_get_contents("php://input");
        file_put_contents('/tmp/2.txt', $weixinData, FILE_APPEND);
//        $weixinData = '<xml><appid><![CDATA[wx2ab0fea26cc22e42]]></appid>
//                            <attach><![CDATA[年终大促销]]></attach>
//                            <bank_type><![CDATA[CMB_CREDIT]]></bank_type>
//                            <cash_fee><![CDATA[1]]></cash_fee>
//                            <fee_type><![CDATA[CNY]]></fee_type>
//                            <is_subscribe><![CDATA[Y]]></is_subscribe>
//                            <mch_id><![CDATA[1498994132]]></mch_id>
//                            <nonce_str><![CDATA[wy925tlwrhp0h1afvqy8viyw9xfi3h3l]]></nonce_str>
//                            <openid><![CDATA[o1rlW1ECN8ht7FVfo-c6HhVYPDik]]></openid>
//                            <out_trade_no><![CDATA[15202126406732971330]]></out_trade_no>
//                            <result_code><![CDATA[SUCCESS]]></result_code>
//                            <return_code><![CDATA[SUCCESS]]></return_code>
//                            <sign><![CDATA[27F18EDAFA7379855A13E4743DF19BFB]]></sign>
//                            <time_end><![CDATA[20180305091731]]></time_end>
//                            <total_fee>1</total_fee>
//                            <trade_type><![CDATA[NATIVE]]></trade_type>
//                            <transaction_id><![CDATA[4200000092201803052953881992]]></transaction_id>
//                        </xml>';
        try {
            $result = new WxPayResults();
            $weixinData = $result->Init($weixinData);
        } catch (\Exception $e) {
            $result->setData('return_code', 'FAIL');
            $result->setData('return_msg', $e->getMessage());
            return $result->toXml();
        }
        if ($weixinData['return_code'] == 'FAIL' || $weixinData['result_code'] !== 'SUCCESS') {
            $result->setData('return_code', 'FAIL');
            $result->setData('return_msg', 'error');
            return $result->toXml();
        }
        //根据订单号来查询数据
        $out_trade_no = $weixinData['out_trade_no'];
        $order = model('order')->get(['out_trade_no' => $out_trade_no]);
        if (!$order || $order->pay_status == 1) {
            $result->setData('return_code', 'SUCCESS');
            $result->setData('return_msg', 'OK');
            return $result->toXml();
        }
        //更新数据
        try {
            $data = model('order')->updateOrderByOutTradeNo($out_trade_no, $weixinData);
            //更新商品表中的购买数量
            model('deal')->updateBuyCountById($order->deal_id, $order->deal_count);
            //更新商品表中的商品数量
            model('deal')->updateTotalCountById($order->deal_id, $order->deal_count);
            //生成购物券
            $coupons = [
                'sn' => $out_trade_no,
                'password' => rand(10000, 99999),
                'user_id' => $order->user_id,
                'deal_id' => $order->deal_id,
                'order_id' => $order->id
            ];
            model('coupons')->add($coupons);
            //发送邮件给用户
            \phpmailer\Email::send($this->account->email, '微信支付成功', '已经将购物券发送到您的订单中');
        } catch (\Exception $e) {
            //说明没有更新，我们还需要回调
            return false;
        }
        $result->setData('return_code', 'SUCCESS');
        $result->setData('return_msg', 'OK');
        return $result->toXml();
    }

    /**
     * 显示指定的资源
     *
     * @param  int $id
     * @return \think\Response
     */
    public function paysuccess()
    {
        //生成购物券
        return $this->fetch();
    }

    /**
     * 显示编辑资源表单页.
     *
     * @param  int $id
     * @return \think\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request $request
     * @param  int $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * 删除指定资源
     *
     * @param  int $id
     * @return \think\Response
     */
    public function delete($id)
    {
        //
    }
}
